home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- Project : Perl -
- File : reentrant.c - Prepare everything for another Perl run
- Author : Matthias Neeracher
- Started : 08Apr93 Language : MPW C
- Modified : 08Apr93 MN
- Last : 08Apr93
- *********************************************************************/
-
- #include <Types.h>
- #include <Resources.h>
- #include <Memory.h>
- #include <LowMem.h>
- #include <Files.h>
-
- #include "EXTERN.h"
- #include "icemalloc.h" /* Thanks, Tim ! */
- #define RESOLVE_MAC_CONFLICTS
- #include "perl.h"
-
- #if !defined(powerc) && !defined(__powerc)
- extern void A5Init(Ptr myA5);
- extern long A5Size(void);
- #endif
-
- void CompareMem(char * orig, char * reset, int len, int offset, short log)
- {
- char error[20];
- long errlen;
-
- while (len--) {
- if (*orig++ != *reset++) {
- sprintf(error, "%06x: %02x %02x\n", offset, orig[-1] & 0xFF, reset[-1] & 0xFF);
- errlen = strlen(error);
- FSWrite(log, &errlen, error);
- }
- --offset;
- }
- }
-
- void reenter()
- {
- #if !defined(powerc) && !defined(__powerc)
- long ** ranges;
- Handle tempGlob;
- Ptr tempA5;
- long * range;
- long size;
- long from;
- short log;
- Str255 name;
- #endif
-
- /* Release all memory allocated on the previous Perl run */
- free_pool_memory(_default_mem_pool->id);
-
- /* Clear all globals and static variables. If any pointers remain, we're probably
- DEAD!
- */
- #include "perl.init"
- reinit_cmd();
- reinit_consarg();
- reinit_doarg();
- reinit_doio();
- reinit_dolist();
- reinit_dump();
- reinit_eval();
- reinit_missing();
- reinit_perl();
- reinit_regexec();
- reinit_stab();
- reinit_str();
- reinit_toke();
- reinit_usersub();
- reinit_util();
- #if !defined(powerc) && !defined(__powerc) && defined(PARANOID)
- name[0] = 14;
- sprintf(name+1, "Log %10d", LMGetTicks());
- Create(name, 0, 'MPS ', 'TEXT');
- FSOpen(name, 0, &log);
- if (!(ranges = (long **) Get1Resource('IRng', 128)))
- return;
- if (!(tempGlob = NewHandle(size = A5Size() - 32)))
- return;
-
- HLock(tempGlob);
- BlockMove(LMGetCurrentA5() - size, *tempGlob, size);
- A5Init(LMGetCurrentA5());
- tempA5 = *tempGlob + size;
- from = size;
- for (range = *ranges; *range; range += 2) {
- BlockMove(tempA5 - from, LMGetCurrentA5() - from, from - range[0]);
- CompareMem(LMGetCurrentA5() - range[0], tempA5 - range[0], range[0]-range[1], range[0], log);
- from = range[1];
- }
- BlockMove(tempA5 - from, LMGetCurrentA5() - from, from);
-
- DisposeHandle(tempGlob);
- ReleaseResource((Handle) ranges);
-
- curcmd = &compiling;
- FSClose(log);
- #endif
- }
-
-